package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.exception.LeaseException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;


import javax.crypto.SecretKey;
import java.util.Date;

/**
 * 雒鑫
 */
public class JwtUtil {
    //1.生成密钥的字节数组
    private static final SecretKey secretKey = Keys.hmacShaKeyFor("M0PKKI6pYGVWWfDZw90a0lTpGYX1d4AQ".getBytes());

    //2.定义生成toekn的方法
    public static String createToken(long id, String username) {
        //2.调用Jwts当中的构造器 构造这个Token并返回
        String token = Jwts.builder().
                //设置token过期的时间
                        setExpiration(new Date(System.currentTimeMillis() + 3600000))
                .claim("userId", id)
                .claim("username", username)
                .signWith(secretKey, SignatureAlgorithm.HS256)
                .compact();
        return token;
    }

    //定义解析token的方法
    public static Claims parseToken(String token) {
        if (token == null) {
            //如果token为空 则返回未登录的请求状态
            throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }
        try {
            // 创建一个 JwtParser 实例，用于解析 JWT（JSON Web Token）
            // Jwts.parserBuilder()：使用构建器模式创建 JWT 解析器
            // .setSigningKey(secretKey)：设置用于验证 JWT 签名的密钥
            // .build()：构建最终的 JwtParser 实例
            JwtParser jwtParser = Jwts.parserBuilder().setSigningKey(secretKey).build();
            //通过该实例去解析这个token
            return jwtParser.parseClaimsJws(token).getBody();


        } catch (ExpiredJwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
        } catch (JwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);
        }
    }

    public static void main(String[] args) {
        String user = JwtUtil.createToken(1L, "13888888888");
        System.out.println(user);
        JwtUtil.parseToken(user);

    }

}
